from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

# --- Part 1: 定义与设置 ---

# 数据库连接 URL
DATABASE_URL = "mysql+mysqlconnector://user:pass@127.0.0.1:3306/bqg_spider"

# 创建引擎
engine = create_engine(DATABASE_URL)

# 创建一个 SessionLocal 类, 它是数据库会话的工厂
# 会话 (Session) 是与数据库进行所有 ORM 操作的句柄
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建一个声明式基类 (Declarative Base)
# 我们定义的模型类都需要继承这个基类
Base = declarative_base()


# --- Part 2: 定义数据模型 (Model) ---

class User(Base):
    __tablename__ = 'users'  # 映射到数据库中的 'users' 表

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True, index=True)

    def __repr__(self):
        return f"<User(name='{self.name}', email='{self.email}')>"


# --- Part 3: 创建表并与数据库交互 ---

# 1. 在数据库中创建 `users` 表 (如果它不存在)
print("正在创建 'users' 表 (如果不存在)...")
Base.metadata.create_all(bind=engine)
print("表已确认存在。")

# 2. 创建一个数据库会话实例
db = SessionLocal()

try:
    # 3. 创建一个新的 User 对象 (就像创建普通 Python 对象一样)
    new_user = User(name="Alice", email="alice@example.com")
    print(f"准备添加新用户: {new_user}")

    # 4. 将新对象添加到会话中
    db.add(new_user)

    # 5. 提交事务, 将更改写入数据库
    db.commit()
    print("用户已成功提交到数据库。")

    # 6. 从数据库中查询刚刚添加的用户
    print("正在从数据库中查询用户 'Alice'...")
    retrieved_user = db.query(User).filter(User.name == "Alice").first()
    
    if retrieved_user:
        print(f"查询成功: {retrieved_user}")
    else:
        print("查询失败!")

finally:
    # 7. 关闭会话, 释放资源
    db.close()
    print("数据库会话已关闭。")